package com.syl.practice.datatype;

import java.util.ArrayList;
import java.util.List;

/**
 *  数据类型
 */
public class Calculation {

    public static void main(String[] args) {
//        System.out.println((0.2*10 + 0.1*10)/10);
//        remove(1);
//        removeLoop();
//        integerTest();
        strTest();
    }

    // 方法重载
    // 传入Integer类型参数1，直接删除参数1；
    // 传入int类型参数1，会删除index=1对应的参数
    public static void remove(Integer param){
        List<Integer> list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.remove(param);
        System.out.println(list.toString());
    }

    // 这种循环删除会报ConcurrentModificationException异常
    // 调用next()方法获取下一个元素时，第一行代码就是调用了checkForComodification();，而该方法的核心逻辑就是比较modCount和expectedModCount这2个变量的值。
    public static void removeLoop(){

        List<Integer> list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);

        for (Integer factor : list) {
            list.remove(factor);
        }

        System.out.println(list.toString());
    }

    // 针对所有封装类
    public static void integerTest(){

        List<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(11);
        list.add(12);

        Integer val = list.get(0);
        System.out.println("修改前val =="+val);
        // list存放的是Integer的引用地址，
        // 当执行val=20时，将20所在内存地址赋值给val所在内存，未影响list.get(0)内存
        val = 20;
        System.out.println("修改后val =="+val);

        System.out.println(list.toString());
    }

    // str1 = "cd";执行这步操作时，其实就是将“cd”的内存地址放入str1所在内存，并未影响str
    public static void strTest(){
        String str = "ab";
        System.out.println("str hashcode -- "+str.hashCode());
        change(str);
        System.out.println("str == "+str);
    }

    public static void change(String str1){
        str1 = "cd";
        System.out.println("str1 == "+str1);
        System.out.println("str1 hashcode -- "+str1.hashCode());
    }

}
